package org.custom.ibatis.transaction;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

/**
 * @author DJJ_F
 * @version 1.0
 * @date 2025/02/26
 * @description JDBC事务管理器的实现类,
 * 需要获取和设置连接对象，所以需要数据源, 和相关的信息
 */
public class JDBCTransactionManager implements TransactionManager {
    /**
     * 数据源
     */
    private DataSource dataSource;
    /**
     * 是否自动提交
     */
    private boolean autoCommit;
    private Connection connection;

    /**
     * 通过构造方法给属性赋值
     *
     * @param dataSource
     * @param autoCommit
     */
    public JDBCTransactionManager(DataSource dataSource, boolean autoCommit) {
        this.dataSource = dataSource;
        this.autoCommit = autoCommit;
    }

    @Override
    public void commit() {
        try {
            connection.commit();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public void rollback() {
        try {
            connection.rollback();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public void close() {
        try {
            connection.close();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * openConnection是从数据源获取连接对象
     * 以上的方法要确保执行的是同一个connection对象
     * 所以要有这个方法来控制
     */
    @Override
    public void openConnection() {
        // 为空时才获取应该新的对象，以确保控制事务的时候是同一个对象
        if (connection == null) {
            try {
                connection = dataSource.getConnection();
                // 这里要关闭自动提交，开启事务
                connection.setAutoCommit(autoCommit);
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    }

    /**
     * connection既然是属性 那应该要提供get方法
     * 以执行sql语句
     *
     * @return
     */
    @Override
    public Connection getConnection() {
        return connection;
    }
}
